# class A:
#     # 类变量,随着类加载就存在
#     b = 1
#
#     def __init__(self, x, y):
#         # 实例变量
#         self.x = x
#         self.y = y
#
#
# a = A(2, 3)
# print(a.x, a.y, a.b)
#
# # 类访问类变量
# print(A.b)  # 1
#
# # 类不能访问实例变量，实例变量只能实例对象访问
# # print(A.x) 无法访问
#
# # 使用类修改类变量
# A.b = 10
# print(A.b)
# print(a.b)  # 当实例对象调用b属性的时候，它会在__init__中先寻找b属性，如果找不到，就会去类变量中找，最后返回
#
# # 使用实例对象修改类变量
# a.b = 100
# print(a.b, A.b)
#
# """
# 实例对象修改b类变量的时候，它会重新创建一个实例变量
# 相当于：__init__ 中新增了self.b = 100, 那它就不会向上查询类变量b
# """
#
# """
# 类变量可以共享于多个实例对象
# """
# c = A(1, 2)
# c.b = 5
# print(c.b, a.b, A.b)


# 多继承的深度优先和广度优先查找 （C3算法）

# # 深度优先
# class D:
#     pass
#
#
# class E:
#     pass
#
#
# class C(E):
#     pass
#
#
# class B(D):
#     pass
#
#
# class A(B, C):
#     pass
#
# # 通过mro方法进行查找顺序的打印,mro打印类的继承关系, 查询顺序 A ->B->D->C->E->object
# print(A.__mro__)


# 广度优先
class D:
    pass


class C(D):
    pass


class B(D):
    pass


class A(B, C):
    ...


print(A.__mro__)  # 查询顺序 A ->B->C->D->object
